抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

Qingwan

在时间的维度上,一切问题都是有解的。

Dedecms框架漏洞复现②

漏洞影响范围

DeDeCMS v5.7 SP2 (只影响前台用户)

利用成功前提条件

  • 开启会员模块 
  • 攻击者拥有一个正常的会员账号 
  • 目标没有设置安全问题

漏洞利用

首先下载安装好dedecms v5.7 sp2
(tips:我用phpstudy搭建的,这里记得网站php版本调低一点,我一开始用的php7会报错,调成php5就正常了)
然后我们点开会员设置,打开会员功能

打开会员功能,注册一个账号,这里一定要记住不要设置安全问题

查看一下我们刚刚注册的用户的id

输入下面这个url,进入修改信息网站,然后抓包
localhost/DedeCMS-V5.7-UTF8-SP2/DedeCMS-V5.7-UTF8-SP2/uploads/member/resetpassword.php?dopost=safequestion&safequestion=0.0&safeanswer=&id=2
看到这里有个key=Bp7DfL6是临时验证码

拿到这个临时key之后就可以修改密码了

所以如果我们知道一个会员用户名,并且这个用户没有设置安全问题,同时我们知道他的id,就可以任意修改他的密码了

漏洞分析

这里修改用户名密码,有两种方式,一种是通过邮箱验证去修改,另外一种是通过安全问题去修改,这里就是利用了安全问题修改用户名密码的漏洞
看到/upload/member/resetpassword.php页面
用安全问题验证这里,经过两个if判断之后,就进入了sn函数,这个函数就是我们的修改密码的函数

在没有设置安全问题和答案时,safequestion=0safeanswer=null(为空)

所以0.0==0为true,''==null为true,成功绕过,而且从上图可知,此时的sendN
sn函数的定义如下

从之前可知,我们的sendN,则就不发送邮箱验证码,接下来看到newmail这个函数

我们来到sendN之后的逻辑,可以看到这里返回了我们漏洞复现中修改密码的url,需要我们的id还有临时验证码key
所以最终为:
/member/resetpassword.php(safequestion)-> /member/resetpassword.php(sn)-> /member/inc/inc_pwd_functions.php(newmail)

修复建议

最后的修复,就是把弱等于==,改为强等于===

1
2
3
4
5
6
7
8
9
10
11
12
13
// member/resetpassword.php
else if($dopost == "safequestion")
{
// ...
if(empty($safequestion)) $safequestion = '';
if(empty($safeanswer)) $safeanswer = '';
// TODO: https://xz.aliyun.com/t/1927 已经修复,任意密码重置,弱类型
if ($row['safequestion'] === $safequestion && $row['safeanswer'] === $safeanswer) {
sn($mid, $row['userid'], $row['email'], 'N');
exit();
}
// ...
}

评论